package body Statistiques is

	procedure Init (S : out Stat) is
	begin
		S.Nb_Commandes_Satisfaites := (Others => 0);
		S.Nb_Commandes_Attente := (Others => 0);
		S.Nb_Commandes_Erronees := 0;
	end Init;
	
	procedure Incr_Commandes_Satisfaites (S : in out Stat; Cat : in Categories.Categorie) is
	begin
		Incr(S.Nb_Commandes_Satisfaites(Categories.Get_Categorie_Verre(Cat)));
	end Incr_Commandes_Satisfaites;
		
	procedure Incr_Commandes_Attente (S : in out Stat; Cat : in Categories.Categorie) is
	begin
		Incr(S.Nb_Commandes_Attente(Categories.Get_Categorie_Verre(Cat)));	
	end Incr_Commandes_Attente;
	
	procedure Incr_Commandes_Erronees (S: in out Stat) is
	begin
		Incr(S.Nb_Commandes_Erronees);
	end Incr_Commandes_Erronees;
	
	function Nb_Commandes (S : Stat) return Natural is
	begin
		return (Somme(S.Nb_Commandes_Satisfaites) + Somme(S.Nb_Commandes_Attente) + S.Nb_Commandes_Erronees);
	end Nb_Commandes;

	function Nb_Commandes_Satisfaites (S : Stat) return Natural is
	begin
		return Somme(S.Nb_Commandes_Satisfaites);
	end Nb_Commandes_Satisfaites;
	
	function Nb_Commandes_Attente (S : Stat) return Natural is
	begin
		return Somme(S.Nb_Commandes_Attente);
	end Nb_Commandes_Attente;
	
	function Nb_Commandes_Erronees (S : Stat) return Natural is
	begin
		return S.Nb_Commandes_Erronees;
	end Nb_Commandes_Erronees;
	
	function Qu_Commandes_Erronees (S : Stat) return Natural is
	begin
	    if Nb_Commandes(S) /= 0 then
		    return Nb_Commandes_Erronees(S) * 100 / Nb_Commandes(S);
	    else
	        return 0;
        end if;
	end Qu_Commandes_Erronees;
	
	function Qu_Commandes_Non_Satisfaites (S : Stat) return Natural is
	begin
	    if Nb_Commandes(S) /= 0 then
		    return Somme(S.Nb_Commandes_Attente) * 100 / Nb_Commandes(S);
	    else
	        return 0;
        end if;
	end Qu_Commandes_Non_Satisfaites;
		
	function Qu_Commandes_Non_Satisfaites (S : Stat; Verre : Categorie_Verre) return Natural is
	begin
	    if Nb_Commandes(S) /= 0 then
		    return S.Nb_Commandes_Attente(Verre) * 100 / Nb_Commandes(S);
	    else
	        return 0;
        end if;
	end Qu_Commandes_Non_Satisfaites;

	procedure Incr (N : in out Natural) is
	begin
		N := N + 1;
	end Incr;
	
	function Somme (A : Nb_Commandes_Par_Categorie) return Natural is
		Sum : Natural := 0;
	begin
		for I in A'range loop
    		Sum := Sum + A(I);
 		end loop;
 		return Sum;
 	end Somme;

    function ToString(S : Stat) return String is
        Desc : Unbounded_String;
    begin
        Desc := To_Unbounded_String(
                "Nombre total de commandes traitées lors de la planification (NbC) : " & 
                Fg(Blue) & Natural_To_Str(Nb_Commandes(S)) & Fg & ASCII.LF &
                "Nombre de commandes en attente (NbCA) : " &
                Fg(Yellow) & Natural_To_Str(Nb_Commandes_Attente(S)) & Fg & ASCII.LF &
                "Nombre de commandes de la journée (NbCJ) : " &
                Fg(Green) & Natural_To_Str(Nb_Commandes_Satisfaites(S)) & Fg & ASCII.LF &
                "Proportion de commandes erronées : " &
                Fg(Red) & Natural_To_Str(Qu_Commandes_Erronees(S)) & "%" & Fg & ASCII.LF &
                "Proportion de commandes non satisfaites : " &
                Fg(Yellow) & Natural_To_Str(Qu_Commandes_Non_Satisfaites(S)) & "%" & Fg & ASCII.LF
                );
               
        for I in Categorie_Verre loop
            if Liste_Categories.Appartient(I) then
                Desc := Desc & To_Unbounded_String("Proportion de commandes non satisfaites (catégorie " & Fg(Cyan) & I & Fg & ") : " & 
                                Fg(Yellow) & Natural_To_Str(Qu_Commandes_Non_Satisfaites(S, I)) & "%" & Fg & ASCII.LF);
            end if;
        end loop;
        return To_String(Desc);
    end ToString;
end Statistiques;